package done.easy_501_600;

import org.junit.Test;

import static com.study.util.LogUtil.info;
import static com.study.util.SwapUtil.swap;

/**
 * 541. Reverse String II 反转字符串 II
 * <p>
 * 给定一个字符串和一个整数 k，你需要对从字符串开头算起的
 * 每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字
 * 符，则将剩余的所有全部反转。如果有小于 2k 但大于或等于
 * k 个字符，则反转前 k 个字符，并将剩余的字符保持原样。
 * <p>
 * 示例:
 * 输入: s = "abcdefg", k = 2
 * 输出: "bacdfeg"
 * <p>
 * k = 2
 * ① 前2k个字符 abcd
 * --->
 * abcdefg
 * <p>
 * ② 前k个字符 ab 反转
 * ->
 * abcdefg
 * <-
 * bacdefg
 * <p>
 * ③ 前2k个字符，efg
 * -->
 * bacdefg
 * <p>
 * ④ 前k个字符 ef 反转
 * <-
 * bacdfeg
 *
 * @author 大硕
 * 2019-04-10 11:39 PM
 **/
@SuppressWarnings("all")
public class ReverseStringII {

    public String reverseStr(String s, int k) {
        // 190411 first
        return null;
    }

    @Test
    public void test() {
        info(reverseStr("abcdefg", 2));
        info("bacdfeg");
    }
}









































/*
// 方法一
public String reverseStr(String s, int k) {
    char[] chars = s.toCharArray();

    // i自增, 步长为2k
    for (int i = 0; i < chars.length; i = i + k * 2) {
        int  size = i + k - 1;

        //如果反转到了最后  size要判断有没有溢出
        if (size > s.length() - 1) {
            size = s.length() - 1;
        }

        // b = i + k - 1;
        // j = i
        // j++ b-- 向中间靠近
        // j 的上限是 (i + size) / 2
        for (int j = i, b = size; j <= (i + size) / 2; j++, b--) {   //反转
            swap(chars, j, b);
        }
    }
    return new String(chars);
}

// 方法二
public String reverseStr(String s, int k) {
    char[] str = s.toCharArray();

    //步长为 2k
    for (int i = 0; i < str.length; i += 2*k) {
        int start = i;
        int end = i + k - 1;

        //如果反转到了最后  size要判断有没有溢出
        if (end > s.length() - 1) {
            end = s.length() - 1;
        }

        while (start <= end) {
            swap(str, start, end);
            start++;
            end--;
        }
    }
    return new String(str);
}
*/
